package cn.lcsjsxy.yxc.io;

import org.junit.jupiter.api.Test;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * 处理流之二：转换流的使用
 * 1.转换流：属于字符流
 * InputSteamReader:将一个字节的输入流转换为字符的输入流
 * OutputStreamWriter：将一个字符的输出流转换为字节的输出流
 * <p>
 * 2.作用：提供字节流与字符流之间的转换
 * <p>
 * 3.解码：字节、字节数组 ---》字符数组、字符串
 * 编码：字符数组、字符串 ---》字节、字节数组
 * <p>
 * 4.字符集
 *
 *
 */
public class InputStreamReaderTest {

    /*
     * 此时处理异常的话，仍然应该使用try-catch-finally
     * InputStreamReader的使用，实现字节的输入流到字符的输入流的转换
     */
    @Test
    public void test1() {
        FileInputStream fis = null;
        InputStreamReader isr = null;
        try {
            fis = new FileInputStream("hello.txt");
//        isr=new InputStreamReader(fis);  //使用系统默认的字符集
            isr = new InputStreamReader(fis, "UTF-8");  //指明了字符集，具体使用哪个字符集，取决于文件保存时使用的字符集、
            char[] cbuf = new char[20];
            int len;
            while ((len = isr.read(cbuf)) != -1) {
                String str = new String(cbuf, 0, len);
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (isr != null)
                    isr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
     * 综合使用InputStreamReader和OutputStreamWriter
     * */
    @Test
    public void test2() {
        FileInputStream fis = null;
        FileOutputStream fos=null;
        InputStreamReader isr=null;
        OutputStreamWriter osw=null;

        try {
            File file1 = new File("hello.txt");
            File file2 = new File("hello_co.txt");

            fis=new FileInputStream(file1);
            fos=new FileOutputStream(file2);

            isr=new InputStreamReader(fis, StandardCharsets.UTF_8);
            osw=new OutputStreamWriter(fos,"gbk");

            char[] cbuf=new char[1024];
            int len;
            while ((len=isr.read(cbuf))!=-1){
                osw.write(cbuf,0,len);
            }

        } catch (FileNotFoundException | UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (isr!=null){
                    isr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                if (osw!=null){
                    osw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
